from datetime import datetime
from collections import namedtuple
from collections import deque
from collections import defaultdict

# 内建模块
#
#
# datetime
now = datetime.now()  # 获取当前datetime
print("datetime  test ", now)
print(type(now))

dt = datetime(2015, 4, 19, 12, 20)  # 用指定日期时间创建datetime
print("datetime  test ", dt)

print("datetime  test ", dt.timestamp())  # 把datetime转换为timestamp
# timestamp转换为datetime
t = 1469417200.0
print("datetime  test ", datetime.fromtimestamp(t))
# str转换为datetime
cday = datetime.strptime('2019-9-9 18:19:59', '%Y-%m-%d %H:%M:%S')
print("datetime  test ", cday)
# datetime转换为str
# datetime加减
# 本地时间转换为UTC时间
# 时区转换

# collections
# collections是Python内建的一个集合模块，提供了许多有用的集合类。

# namedtuple
# 我们知道tuple可以表示不变集合，例如，一个点的二维坐标就可以表示成：p = (1, 2),但是，看到(1, 2)，很难看出这个tuple是用来表示一个坐标的。
# 定义一个class又小题大做了，这时，namedtuple就派上了用场
Point = namedtuple('Point', ['x', 'y'])
p = Point(1, 2)
print("namedtuple test", "x= " + str(p.x), "y= " + str(p.y))

# namedtuple('名称', [属性list]):
Circle = namedtuple('Circle', ['x', 'y', 'r'])

# deque
# 使用list存储数据时，按索引访问元素很快，但是插入和删除元素就很慢了，因为list是线性存储，数据量大的时候，插入和删除效率很低。
#
# deque是为了高效实现插入和删除操作的双向列表，适合用于队列和栈：
q = deque(['a', 'b', 'c'])
q.append('x')
q.appendleft('y')
print("deque test ", q)

# defaultdict
# 使用dict时，如果引用的Key不存在，就会抛出KeyError。如果希望key不存在时，返回一个默认值，就可以用defaultdict：

dd = defaultdict(lambda: 'bench')
dd['key1'] = 'abc'

dd['key2']
print("defaultdict test ", dd['key2'], dd['key1'])

# OrderedDict
# 使用dict时，Key是无序的。在对dict做迭代时，我们无法确定Key的顺序。

# ChainMap
# ChainMap可以把一组dict串起来并组成一个逻辑上的dict。ChainMap本身也是一个dict，但是查找的时候，会按照顺序在内部的dict依次查找。

# Counter
# Counter是一个简单的计数器，例如，统计字符出现的个数：

